#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <ctime>



/*****定义*****/
struct Node
{
    int data;
    struct Node *next;
};
typedef struct Node Node;
typedef struct Node *LinkList;



/*****核心功能函数*****/
LinkList Reverse(LinkList &L)
{
    LinkList p0, p1, p2;
    p0 = L->next;       // p0始终指向原来的第一个结点（不包括头结点），目的是最后把NULL赋给它的指针域
    p1 = L->next->next; // p1始终指向这一轮中需要移到最前面（不包括头结点）的那个结点
    p2 = p1->next;

    while (p2 != NULL)
    {
        p1->next = L->next;
        L->next = p1;
        p1 = p2;
        p2 = p2->next;
    }
    p1->next = L->next;
    L->next = p1;
    p0->next = NULL;

    return L;
}



/*****随机生成单链表*****/
LinkList List_TailInsert(int l, LinkList &L) // 随机生成一个长度为l的单链表（未排序并且有头结点）
{
    int k = 1;
    int x = 0;
    L = (LinkList)malloc(sizeof(Node)); // 创建头结点
    LinkList s;
    LinkList r = L; // r为表尾指针
    while (k <= l)
    {
        x = rand() % 101;
        s = (LinkList)malloc(sizeof(Node)); // 由系统生成一个Node型的结点，同时将该结点的起始位置赋值给指针变量s
        s->data = x;
        r->next = s;
        r = s;
        k = k + 1;
        printf("%d ", x);
    }
    r->next = NULL;
    printf("\n");
    return L;
}



/*****输出一个单链表*****/
void printd(LinkList L)
{
    LinkList p = L->next;
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}



/*****主函数*****/
int main()
{
    //生成一个单链表
    LinkList L = NULL;
    srand(time(0));
    printf("生成的单链表：");
    List_TailInsert(12, L);

    //执行功能函数
    L = Reverse(L);

    //输出符合题意的单链表
    printf("逆序的单链表：");
    printd(L);

    //防止运行后自动退出，需头文件【stdlib.h】
    system("pause"); 
}